package dh

import (
	"fmt"
	"math/big"
)

func dh_emulator() {
	// p为16位质数
	p := big.NewInt(7000487615661733)
	g := big.NewInt(5925845745820835)

	// EXP(a, b, c) = (a ** b) % c
	// 服务器生成A发给客户端
	a := big.NewInt(123)
	A := big.NewInt(0).Exp(g, a, p)
	fmt.Println("A ", A)

	// 客户端生成B发给服务器
	b := big.NewInt(456)
	B := big.NewInt(0).Exp(g, b, p)
	fmt.Println("B ", B)

	// 如果收到的客户端B为一个任意数,则双方协商的密钥将不一致，双方也将无法解密出正确数据
	//B.SetString("123", 0)

	// 服务器拿到客户端的B，生成密钥SA
	SA := big.NewInt(0).Exp(B, a, p)
	fmt.Println("SA", SA)

	// 客户端拿到服务器的A，生成密钥SB
	SB := big.NewInt(0).Exp(A, b, p)
	fmt.Println("SB", SB)

	if SA.String() != SB.String() {
		fmt.Println("SA != SB, 密钥协商失败！")
		return
	}
}
